<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>PyMOTW: ConfigParser &mdash; PyMOTW v1.2 documentation</title>
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '../',
        VERSION:     '1.2',
        COLLAPSE_MODINDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <link rel="author" title="关于这些文档" href="../about.html" />
    <link rel="index" title="索引" href="../genindex.html" />
    <link rel="search" title="搜索" href="../search.html" />
    <link rel="copyright" title="Copyright" href="../copyright.html" />
    <link rel="top" title="PyMOTW v1.2 documentation" href="../index.html" />
    <link rel="next" title="PyMOTW: Queue" href="queue.html" />
    <link rel="prev" title="介绍" href="../introduce.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>导航</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="一般索引"
             accesskey="I">索引</a></li>
        <li class="right" >
          <a href="queue.html" title="PyMOTW: Queue"
             accesskey="N">后一篇</a> |</li>
        <li class="right" >
          <a href="../introduce.html" title="介绍"
             accesskey="P">前一篇</a> |</li>
        <li><a href="../index.html">PyMOTW v1.2 documentation</a> &raquo;</li> 
      </ul>
    </div>  
    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  
  <div class="section" id="pymotw-configparser">
<h1>PyMOTW: ConfigParser<a class="headerlink" href="#pymotw-configparser" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li>模块： ConfigParser</li>
<li>目的： 读取/写入配置文件,类似于Windows的INI文件</li>
<li>python版本： 1.5+</li>
</ul>
<div class="section" id="id1">
<h2>描述<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<p>ConfigParser模块可以为你的应用程序创建用户可编辑的配置文件. 这个配置文件由一个个节组成, 每个节可以包含配置数据的名字-值对. 支持通过使用Python的格式化字符串进行值的插入, 以此来构建那些依赖于其他值的数据值(这对路径或URL来说是尤其方便的).</p>
<p>在工作中,当我们把东西移动到svn和 <a class="reference external" href="http://trac.edgewall.org/">trac</a> 之前, 我们开发推出了自己的用于进行分布式代码复查的工具. 为了准备好需要复查的代码, 一个开发者常常需要写完一个&#8221;approach&#8221;摘要文件, 然后附上被修改后的代码(即和原代码有区别的地方). 这个approach文档支持通过Web页面添加注释, 因此开发者不在我们的主要办公室里也可以复查代码. 但是唯一的麻烦之处是, 发表代码的不同之处让人感到有点痛苦. 想要让部分处理过程变得简单些, 我写了一个命令行工具, 运行他可以针对CVS沙盒, 自动的寻找出并发表代码的不同之处.</p>
<p>为了能够让这个工具即时更新approach文档中的区别, 需要知道怎样到达存放approach文档的网络服务器. 由于我们开发者不总是在办公室, 从任意给定主机到达服务器的URL可能是通过SSH端口转发过来的. 为了不强迫每个开发者都使用同样的端口转发协议?这个工具应使用一个简单的配置文件来记住这个URL.</p>
<p>一个开发者的配置文件可能会是这个样子:</p>
<div class="highlight-python"><pre>[portal]
url = http://%(host)s:%(port)s/Portal
username = dhellmann
host = localhost
password = SECRET
port = 8080</pre>
</div>
<p>portal小节表示approach文件的网址. 一旦代码的区别被发送到这个网址, 我们的工具应该下载这个配置文件, 通过ConfigParser模块来访问URL. 这可能看起来像这样:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">ConfigParser</span> <span class="kn">import</span> <span class="n">ConfigParser</span>
<span class="kn">import</span> <span class="nn">os</span>

<span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s">&#39;HOME&#39;</span><span class="p">],</span> <span class="s">&#39;.approachrc&#39;</span><span class="p">)</span>

<span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="p">()</span>
<span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">([</span><span class="n">filename</span><span class="p">])</span>

<span class="n">url</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;portal&#39;</span><span class="p">,</span> <span class="s">&#39;url&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>上述的例子中, 变量url的值为&#8221;<a class="reference external" href="http://localhost:8080/Portal">http://localhost:8080/Portal</a>&#8220;. 配置文件中的变量url中包含两个格式化字符串:&#8221;%(host)s&#8221;和&#8221;%(port)s&#8221;. 通过 <tt class="docutils literal"><span class="pre">get()</span></tt> 方法, 自动地将变量host和port的值替换到格式化字符串中.</p>
<p>当然, 这是基于Python2.1的旧代码. 在近来的版本中,ConfigParser模块已经被改进了很多. SafeConfigParser类是a drop? 用来取代ConfigParser, 以改善插值处理.</p>
<p>对于这个工具, 我只需要字符串选项. ConfigParser支持其他的选项类型:整型, 浮点型和布尔型. 由于可选文件格式不提供直接使用一个值来关联一种类型的方式, 所以调用者需要知道何时需要使用一种不同的函数来查询那些其他类型的选项. 例如, 为了查找一个布尔选项, 使用 <tt class="docutils literal"><span class="pre">getboolean()</span></tt> 函数而不是 <tt class="docutils literal"><span class="pre">get()</span></tt> 函数. 函数的参数是一样的, 但是选项的值在返回之前被转换为一个布尔类型. 类似地, 还有独立的 <tt class="docutils literal"><span class="pre">getint()</span></tt> 和 <tt class="docutils literal"><span class="pre">getfloat()</span></tt> 函数.</p>
<p>ConfigParser类也支持增加和删除小节到指定文件并保存结果. 这使得创建一个用于编辑程序的配置的用户界面,或是利用配置文件格式存放简单数据文件成为可能. 例如, 一个应用需要存储小量的类似于数据库格式的数据, 可以利用ConfigParser类, 这样一来生成的文件也是人类可读的.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="../index.html">目录</a></h3>
            <ul>
<li><a class="reference external" href="">PyMOTW: ConfigParser</a><ul>
<li><a class="reference external" href="#id1">描述</a></li>
</ul>
</li>
</ul>

            <h4>前一个主题</h4>
            <p class="topless"><a href="../introduce.html" title="前一章节">介绍</a></p>
            <h4>后一个主题</h4>
            <p class="topless"><a href="queue.html" title="后一章节">PyMOTW: Queue</a></p>
            <h3>当前主题</h3>
            <ul class="this-page-menu">
              <li><a href="../_sources/documents/configparser.txt">显示页面源码</a></li>
            </ul>
          <h3>快速搜索</h3>
            <form class="search" action="../search.html" method="get">
              <input type="text" name="q" size="18" /> <input type="submit" value="提交" />
              <input type="hidden" name="check_keywords" value="yes" />
              <input type="hidden" name="area" value="default" />
            </form>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>导航</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="../genindex.html" title="一般索引"
             accesskey="I">索引</a></li>
        <li class="right" >
          <a href="queue.html" title="PyMOTW: Queue"
             accesskey="N">后一篇</a> |</li>
        <li class="right" >
          <a href="../introduce.html" title="介绍"
             accesskey="P">前一篇</a> |</li>
        <li><a href="../index.html">PyMOTW v1.2 documentation</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
      &copy; <a href="../copyright.html">Copyright</a> 2008, vbarter &amp; liz.
      使用 <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.5.1创建.
    </div>
  </body>
</html>